﻿using System.Web.Http.Controllers;
using System.Web.Mvc;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
using User.EF.Contracts;
using User.EF.Model;
using User.EF.Queries;
using User.Global.Common.Mail;
using User.Global.Contracts.Mail;
using User.Global.Contracts.Membership;
using User.Global.Contracts.Message;
using User.Web.Common.Membership;
using User.Web.UI.Controllers;
using User.Web.UI.Helper.Localization;
using User.Web.UI.Helper.Messages;

namespace User.Web.UI.Helper.CastleWindsor
{
    /// <summary>
    /// Installer für alle wichtigen Webverweise
    /// </summary>
    public class WebInstaller : IWindsorInstaller
    {
        private  string ConnectionString { get; set; }

        /// <summary>
        /// Initialize WebInstaller
        /// </summary>
        /// <param name="connectionString">Connectionstring übergeben, der für den Webinstaller benötigt wird.</param>
        public WebInstaller(string connectionString)
        {
            ConnectionString = connectionString;
        }

        /// <summary>
        /// Performs the installation in the <see cref="T:Castle.Windsor.IWindsorContainer"/>.
        /// </summary>
        /// <param name="container">The container.</param><param name="store">The configuration store.</param>
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            //Castle Windsor Links zum Registrieren.
            //http://blogs.7digital.com/dev/2010/09/09/adding-dependencies-to-components-with-castle-windsor/

            //Unseren ModelContainer Registrieren mit dem passenden Connectionstring dazu, ACHTUNG wir müssen die Instanz nehmen, da wir darauf auch bei einigen Anderen 
            //Statischen "Variablen" zugreifen, z.B. Rechteverwaltung und Co.
            container.Register(Component.For(typeof(MainModelContainer)).Instance(CurrentHttpContext.GetDataModel()).LifestylePerWebRequest());
            //container.Register(Component.For(typeof(MainModelContainer)).DependsOn(new { connectionString = ConnectionString }).LifestylePerWebRequest());
            //Alle Queries Registrieren die sich in der Assembly "User.EF.Queries" befinden und jeweils ein passendes Interface enthalten wie 
            //"IMemberQueries/MemberQueries" siehe auch: http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx
            //container.Register(Classes.FromAssemblyContaining<IMembershipQueries>().InNamespace("User.EF.Queries").WithService.DefaultInterfaces().LifestylePerWebRequest());
            container.Register(Classes.FromAssemblyContaining<MembershipQueries>().InNamespace("User.EF.Queries").WithService.DefaultInterfaces().LifestylePerWebRequest());

            //klappt so nicht, da dies so nicht von Castle Windsor unterstützt wird, hier muss z.B. Ninject verwendet werden.
            container.Register(Component.For<ILocalizeable>().ImplementedBy<Localizeable>().LifestylePerWebRequest());

            //Alle Controller Registrieren die IController beinhalten/nutzen.
            container.Register(Classes.FromAssemblyContaining<HomeController>().BasedOn<IController>().LifestylePerWebRequest());
            //Alle WebAPI Controller verwenden IHttpController
            container.Register(Classes.FromAssemblyContaining<HomeController>().BasedOn<IHttpController>().LifestylePerWebRequest());
            //Alle IAddMessage Properties im Controller mit CustomMessage Initialisieren.
            container.Register(Component.For<IAddMessage>().ImplementedBy<CustomMessage>().LifestylePerWebRequest());
            //Unseren Membership "Provider" initialisieren mit "Member" als Generic Class
            container.Register(Component.For<IDiMembership<Member>>().ImplementedBy<DiMembership>().LifestylePerWebRequest());
            //Unseren Mailversand registrieren.
            container.Register(Component.For<IAccountMails>().ImplementedBy<AccountMails>().LifestylePerWebRequest());

            //Membership
            //http://stackoverflow.com/questions/4401244/castle-windsor-ioc-in-an-mvc-application

            // container.Register(Component.For(typeof(CustomMessage)).DependsOn(new { controller = new HomeController() }))
            //container.Register(Component.For<IController>().ImplementedBy<HomeController>());
            //container.Register(Classes.FromThisAssembly().InNamespace("User.Web.UI.Helper.Messages").WithService.FirstInterface().LifestylePerWebRequest());
            //container.Register(Component.For<IController>().ImplementedBy<HomeController>().LifestylePerWebRequest());
            //container.Register(Classes.FromThisAssembly().InNamespace("User.Web.UI.Helper.Messages").WithService.AllInterfaces().LifestylePerWebRequest());
            //container.Register(Classes.FromThisAssembly().InNamespace("User.Web.UI.Helper.Messages").WithService.FromInterface(typeof(IAddMessage)).LifestylePerWebRequest());
        }
    }
}
